home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 2001 May / SGI Freeware 2001 May - Disc 1.iso / dist / patchSG0003743.idb / usr / include / fmath.h.z / fmath.h
Text File  |  2001-04-12  |  23KB  |  519 lines

  1. /* USMID @(#) clibinc/fmath.h    92.3    06/25/99 14:36:12 */
  2. /*
  3.  *    (C) COPYRIGHT CRAY RESEARCH, INC.
  4.  *    UNPUBLISHED PROPRIETARY INFORMATION.
  5.  *    ALL RIGHTS RESERVED.
  6.  */
  7.  
  8. /* The following values are used by the F90 compiler for a set of environment
  9.  * intrinsics.  Some of the values are also used by the libf/intrin library
  10.  * to return a value for some of the array intrinsics: DIGITS, EPSILON, HUGE,
  11.  *  MAXEXPONENT, MINEXPONENT, PRECISION, RADIX, RANGE, TINY.
  12.  * 
  13.  * The F90 compiler needs a complete set of each IEEE and non-IEEE values.
  14.  * Please keep the complete set of values for YMP and for IEEE.
  15.  *
  16.  * YMP/C90/etc:
  17.  * Integer*1 =            2147483647 signed
  18.  * Integer*2 =            2147483647 signed
  19.  * Integer*4 =            2147483647 signed
  20.  * Integer*6 =        70368744177663 46-bit value
  21.  * Integer*8 =   9223372036854775807 signed
  22.  * IEEE MPP and SPARC:
  23.  * Integer*1 =            2147483647 signed
  24.  * Integer*2 =            2147483647 signed
  25.  * Integer*4 =            2147483647 signed
  26.  * Integer*6 =   9223372036854775807 signed
  27.  * Integer*8 =   9223372036854775807 signed
  28.  * IEEE TRITON:
  29.  * Integer*1 =            2147483647 signed
  30.  * Integer*2 =            2147483647 signed
  31.  * Integer*4 =            2147483647 signed
  32.  * Integer*6 =      1125899906842623 50-bit limit - for fastmode only
  33.  * Integer*8 =   9223372036854775807 signed
  34.  */
  35. /* BIT_SIZE returns the number of bits s for an integer of kind n.
  36.  * An integer object consists of s bits in sequence numbered from right to
  37.  * left from zero to (s-1).  Fastmode bitsize is 64 bits on TRITON,ieee.
  38.  */
  39. /* YMP: */
  40. #define BITSIZE_INT1_F90_Y      8   /* Integer (KIND=1) */
  41. #define BITSIZE_INT2_F90_Y     16   /* Integer (KIND=2) */
  42. #define BITSIZE_INT4_F90_Y     32   /* Integer (KIND=4) */
  43. #define BITSIZE_INT6_F90_Y     46   /* Integer (KIND=6), 46-bit value */
  44. #define BITSIZE_INT8_F90_Y     64   /* Integer (KIND=8) */
  45. /* IEEE: */
  46. #define BITSIZE_INT1_F90_IEEE     8   /* Integer (KIND=1) */
  47. #define BITSIZE_INT2_F90_IEEE    16   /* Integer (KIND=2) */
  48. #define BITSIZE_INT4_F90_IEEE    32   /* Integer (KIND=4) */
  49. #define BITSIZE_INT6_F90_IEEE    64   /* Integer (KIND=6) */
  50. #define BITSIZE_INT8_F90_IEEE    64   /* Integer (KIND=8) */
  51. #if defined(_CRAYMPP) || defined(_WORD32) || defined(__mips) || \
  52.     (defined(_CRAY1) && defined(_CRAYIEEE)) || defined(_LITTLE_ENDIAN)
  53. #define BITSIZE_INT1_F90        BITSIZE_INT1_F90_IEEE
  54. #define BITSIZE_INT2_F90        BITSIZE_INT2_F90_IEEE
  55. #define BITSIZE_INT4_F90        BITSIZE_INT4_F90_IEEE
  56. #define BITSIZE_INT6_F90        BITSIZE_INT6_F90_IEEE
  57. #define BITSIZE_INT8_F90        BITSIZE_INT8_F90_IEEE
  58. #else
  59. #define BITSIZE_INT1_F90        BITSIZE_INT1_F90_Y
  60. #define BITSIZE_INT2_F90        BITSIZE_INT2_F90_Y
  61. #define BITSIZE_INT4_F90        BITSIZE_INT4_F90_Y
  62. #define BITSIZE_INT6_F90        BITSIZE_INT6_F90_Y
  63. #define BITSIZE_INT8_F90        BITSIZE_INT8_F90_Y
  64. #endif
  65.  
  66. /* DIGITS for integer, real, and double precision is number of significant
  67.  * digits in bits in the model.
  68.  * DIGITS on IEEE is the number of mantissa bits and the implicit bit.
  69.  */
  70. /* YMP: */
  71. #define DIGITS_INT1_F90_Y      7   /* Integer (KIND=1) */
  72. #define DIGITS_INT2_F90_Y     15   /* Integer (KIND=2) */
  73. #define DIGITS_INT4_F90_Y     31   /* Integer (KIND=4) */
  74. #define DIGITS_INT6_F90_Y     46   /* Integer (KIND=6), 46-bit value */
  75. #define DIGITS_INT8_F90_Y     63   /* Integer (KIND=8) */
  76. #define DIGITS_REAL4_F90_Y    24   /* Real (KIND=4)    */
  77. #define DIGITS_REAL8_F90_Y    47   /* Real (KIND=8)    */
  78. #define DIGITS_REAL16_F90_Y   95   /* Real (KIND=16)   */
  79. /* IEEE: */
  80. #define DIGITS_INT1_F90_IEEE      7   /* Integer (KIND=1) */
  81. #define DIGITS_INT2_F90_IEEE     15   /* Integer (KIND=2) */
  82. #define DIGITS_INT4_F90_IEEE     31   /* Integer (KIND=4) */
  83. #if defined (_CRAY1) && defined(_CRAYIEEE)
  84. /* change DIGITS_INT6_F90_IEEE 50 for Integer (KIND=6) to allow
  85.  * values to match as 46 bits across PVP systems
  86.  */
  87. #define DIGITS_INT6_F90_IEEE     46   /* Integer (KIND=6) */
  88. #else
  89. #define DIGITS_INT6_F90_IEEE     63   /* Integer (KIND=6) */
  90. #endif
  91. #define DIGITS_INT8_F90_IEEE     63   /* Integer (KIND=8) */
  92. #define DIGITS_REAL4_F90_IEEE    24   /* Real (KIND=4)    */
  93. #define DIGITS_REAL8_F90_IEEE    53   /* Real (KIND=8)    */
  94. #if    defined(_CRAYMPP)
  95. #define DIGITS_REAL16_F90_IEEE   53   /* Real (KIND=16)   */
  96. #elif    defined(__mips)
  97. #define DIGITS_REAL16_F90_IEEE  107   /* Real (KIND=16)   */
  98. #elif    defined(_LITTLE_ENDIAN) && !defined(__sv2)
  99. #define DIGITS_REAL16_F90_IEEE   64   /* Real (KIND=16)   */
  100. #elif    defined(_WORD32) || (defined(_CRAY1) && defined(_CRAYIEEE)) || \
  101.     (defined(_LITTLE_ENDIAN)  && defined(__sv2))
  102. #define DIGITS_REAL16_F90_IEEE  113   /* Real (KIND=16)   */
  103. #endif
  104.  
  105. #if defined(_CRAYMPP) || defined(_WORD32) || defined(__mips) || \
  106.     (defined(_CRAY1) && defined(_CRAYIEEE)) || defined(_LITTLE_ENDIAN)
  107. #define DIGITS_INT1_F90        DIGITS_INT1_F90_IEEE
  108. #define DIGITS_INT2_F90        DIGITS_INT2_F90_IEEE
  109. #define DIGITS_INT4_F90        DIGITS_INT4_F90_IEEE
  110. #define DIGITS_INT6_F90        DIGITS_INT6_F90_IEEE
  111. #define DIGITS_INT8_F90        DIGITS_INT8_F90_IEEE
  112. #define DIGITS_REAL4_F90    DIGITS_REAL4_F90_IEEE
  113. #define DIGITS_REAL8_F90    DIGITS_REAL8_F90_IEEE
  114. #define DIGITS_REAL16_F90    DIGITS_REAL16_F90_IEEE
  115. #else
  116. #define DIGITS_INT1_F90        DIGITS_INT1_F90_Y
  117. #define DIGITS_INT2_F90        DIGITS_INT2_F90_Y
  118. #define DIGITS_INT4_F90        DIGITS_INT4_F90_Y
  119. #define DIGITS_INT6_F90        DIGITS_INT6_F90_Y
  120. #define DIGITS_INT8_F90        DIGITS_INT8_F90_Y
  121. #define DIGITS_REAL4_F90    DIGITS_REAL4_F90_Y
  122. #define DIGITS_REAL8_F90    DIGITS_REAL8_F90_Y
  123. #define DIGITS_REAL16_F90    DIGITS_REAL16_F90_Y
  124. #endif
  125.  
  126. /* EPSILON for real and double precision
  127.  * number that is almost negligible compared to one in the model
  128.  * Real result = (b)**(1-p) = 2**(-46) where p = 47
  129.  * real (KIND=4) = 377534000000000000000
  130.  * real (KIND=8) = 377234000000000000000
  131.  * real (KIND=16) is 2**(p-1) = 2**(-94) where p = 95
  132.  * or 376434000000000000000 0000000000000000000000
  133.  * 
  134.  * HEX values for EPSILON are:
  135.  *
  136.  * YMP:  EPSILON (in hex)                    IEEE: EPSILON (in hex)
  137.  * R*4     3FEA800000000000                |         34000000
  138.  * R*8     3FD3800000000000                | 3CB0000000000000
  139.  * R*16    3FA3800000000000,0              | 3F8F000000000000,0
  140.  *
  141.  * SGI HEX for R*16
  142.  * R*16                                    | 3950000000000000
  143.  *                                         | 0000000000000000
  144.  *
  145.  * LE non-sv2 HEX for R*16
  146.  * R*16                                    | 3C00000000000000
  147.  *                                         | 0000000000000000
  148.  */
  149.  
  150. /* YMP: */
  151. #define EPSILON_REAL4_F90_Y  0.1192092895507812e-06
  152. #define EPSILON_REAL8_F90_Y  0.1421085471520200e-13
  153. #define EPSILON_REAL16_F90_Y 0.50487097934144755546350628178090e-28L
  154. /* IEEE: */
  155. #define EPSILON_REAL4_F90_IEEE 1.192092895507812500E-07 /* Real(KIND=4)= */
  156.                             /* 2**-23 */
  157. #define EPSILON_REAL8_F90_IEEE 2.220446049250313081E-16 /* Real(KIND=8)= */
  158.                             /* 2**-52 */
  159. #if    defined(_CRAYMPP)
  160. #define EPSILON_REAL16_F90_IEEE 2.220446049250313081E-16 /* Real(KIND=8)= */
  161. #elif   defined(__mips)
  162. #define EPSILON_REAL16_F90_IEEE 1.2325951644078309459558258832543534800E-32L
  163. #elif   defined(_LITTLE_ENDIAN) && !defined(__sv2)
  164. #define EPSILON_REAL16_F90_IEEE 1.08420217248550443400745E-19L
  165.                             /* 2**-63 */
  166. #elif    defined(_WORD32) || (defined(_CRAY1) && defined(_CRAYIEEE)) || \
  167.     (defined(_LITTLE_ENDIAN) && defined(__sv2))
  168.                             /* 2**-52 */
  169. #define EPSILON_REAL16_F90_IEEE 1.925929944387235853055977942584927319E-34L
  170.                                               /* Real(KIND=16)=2**-112 */
  171. #endif
  172.  
  173. #if defined(_CRAYMPP) || defined(_WORD32) || defined(__mips) || \
  174.     (defined(_CRAY1) && defined(_CRAYIEEE)) || defined(_LITTLE_ENDIAN)
  175. #define EPSILON_REAL4_F90    EPSILON_REAL4_F90_IEEE
  176. #define EPSILON_REAL8_F90    EPSILON_REAL8_F90_IEEE
  177. #define EPSILON_REAL16_F90    EPSILON_REAL16_F90_IEEE
  178. #else
  179. #define EPSILON_REAL4_F90    EPSILON_REAL4_F90_Y
  180. #define EPSILON_REAL8_F90    EPSILON_REAL8_F90_Y
  181. #define EPSILON_REAL16_F90    EPSILON_REAL16_F90_Y
  182. #endif
  183.  
  184. /* HUGE for integer, real and double precision in the model. 
  185.  * Integer result = (r**q)-1
  186.  * Real result = b**emax*(1-b**(-p))
  187.  * 
  188.  * HEX values for HUGE:
  189.  *
  190.  * YMP:  HUGE (in hex)                       IEEE: HUGE (in hex)
  191.  * I*1                   7F                |               7F
  192.  * I*2                 7FFF                |             7FFF
  193.  * I*4             7FFFFFFF                |         7FFFFFFF
  194.  * ----------------------------------------  FOR MPP and SPARC, ieee
  195.  * I*6         3FFFFFFFFFFF                |         7FFFFFFF
  196.  * ----------------------------------------  FOR CRAY-TS,IEEE
  197.  * OLD:
  198.  * I*6         3FFFFFFFFFFF                |    3FFFFFFFFFFFF
  199.  * NEW:
  200.  * I*6         3FFFFFFFFFFF                |     3FFFFFFFFFFF
  201.  * -------------------------------------------------------------------
  202.  * I*8     7FFFFFFFFFFFFFFF                | 7FFFFFFFFFFFFFFF
  203.  * R*4     5FFDFFFFFF000000                |         7F7FFFFF
  204.  * R*8     5FFDFFFFFFFFFFFE                | 7FEFFFFFFFFFFFFF
  205.  * R*16    5FFDFFFFFFFFFFFE                | 7FFEFFFFFFFFFFFF
  206.  *             FFFFFFFFFFFF                | FFFFFFFFFFFFFFFF
  207.  *
  208.  * SGI HEX for R*16
  209.  * R*16                                    | 7FE0000000000000
  210.  *                                         | F930000000000000
  211.  * LARGEST:
  212.  * R*16                                    | 7FEFFFFFFFFFFFFF
  213.  *                                         | 7C8FFFFFFFFFFFFF
  214.  */
  215.  
  216. /* YMP: */
  217. #define HUGE_INT1_F90_Y              127          /* integer (KIND=1) */
  218. #define HUGE_INT2_F90_Y            32767          /* integer (KIND=2) */
  219. #define HUGE_INT4_F90_Y       2147483647          /* integer (KIND=4) */
  220. #define HUGE_INT6_F90_Y   70368744177663          /* integer (KIND=6) */
  221.                           /* 46-bit */
  222. #define HUGE_INT8_F90_Y   9223372036854775807     /* integer (KIND=8) */
  223. #define HUGE_REAL4_F90_Y  0.13634350882572e+2466  /* 0577757777777600000000 */
  224. #define HUGE_REAL8_F90_Y  0.136343516952426e+2466 /* 0577757777777777777776 */
  225. #define HUGE_REAL16_F90_Y 0.1363435169524269911828730305882e+2466L
  226.                                                   /* 0577757777777777777777 */
  227.                                                   /*       7777777777777776 */
  228. /* IEEE: */
  229. #define HUGE_INT1_F90_IEEE                  127  /* Integer (KIND=1) */
  230. #define HUGE_INT2_F90_IEEE                32767  /* Integer (KIND=2) */
  231. #define HUGE_INT4_F90_IEEE           2147483647  /* Integer (KIND=4) */
  232. #ifdef _WORD32
  233. #define HUGE_INT6_F90_IEEE 9223372036854775807LL /* Integer (KIND=6) */
  234. #define HUGE_INT8_F90_IEEE 9223372036854775807LL /* Integer (KIND=8) */
  235. #elif defined (_CRAY1) && defined(_CRAYIEEE)
  236. /* Change HUGE_INT6_F90_IEEE 1125899906842623L for Integer (KIND=6)
  237.  * to allow values to match as 46 bits across PVP architectures.
  238.  */
  239. #define HUGE_INT6_F90_IEEE      70368744177663L /* integer (KIND=6) */
  240. #define HUGE_INT8_F90_IEEE 9223372036854775807L /* Integer (KIND=8) */
  241. #else
  242. #define HUGE_INT6_F90_IEEE 9223372036854775807L /* Integer (KIND=6) */
  243. #define HUGE_INT8_F90_IEEE 9223372036854775807L /* Integer (KIND=8) */
  244. #endif
  245. #define HUGE_REAL4_F90_IEEE   3.4028234663852886e+38   /* Real (KIND=4) */
  246. #define HUGE_REAL8_F90_IEEE   1.7976931348623158e+308  /* Real (KIND=8) */
  247. #if    defined(_CRAYMPP) || (defined(_LITTLE_ENDIAN) && !defined(__sv2))
  248. #define HUGE_REAL16_F90_IEEE  1.7976931348623158e+308  /* Real (KIND=8) */
  249. #elif    defined(__mips)
  250. /* define HUGE_REAL16_F90_IEEE 1.7976931348623158079372897140530230000E308L */
  251. #define HUGE_REAL16_F90_IEEE 8.98846567431157953864652595394506827E307L
  252. #elif    defined(_WORD32) || (defined(_CRAY1) && defined(_CRAYIEEE)) || \
  253.     (defined(_LITTLE_ENDIAN) && defined(__sv2))
  254. #define HUGE_REAL16_F90_IEEE  1.189731495357231765085759326628007016E+4932L
  255.                         /* Real (KIND=16) */
  256. #endif
  257.  
  258. #if defined(_CRAYMPP) || defined(_WORD32) || defined(__mips) || \
  259.     (defined(_CRAY1) && defined(_CRAYIEEE)) || defined(_LITTLE_ENDIAN)
  260. #define HUGE_INT1_F90        HUGE_INT1_F90_IEEE
  261. #define HUGE_INT2_F90        HUGE_INT2_F90_IEEE
  262. #define HUGE_INT4_F90        HUGE_INT4_F90_IEEE
  263. #define HUGE_INT6_F90        HUGE_INT6_F90_IEEE
  264. #define HUGE_INT8_F90        HUGE_INT8_F90_IEEE
  265. #define HUGE_REAL4_F90        HUGE_REAL4_F90_IEEE
  266. #define HUGE_REAL8_F90        HUGE_REAL8_F90_IEEE
  267. #define HUGE_REAL16_F90        HUGE_REAL16_F90_IEEE
  268. #else
  269. #define HUGE_INT1_F90        HUGE_INT1_F90_Y
  270. #define HUGE_INT2_F90        HUGE_INT2_F90_Y
  271. #define HUGE_INT4_F90        HUGE_INT4_F90_Y
  272. #define HUGE_INT6_F90        HUGE_INT6_F90_Y
  273. #define HUGE_INT8_F90        HUGE_INT8_F90_Y
  274. #define HUGE_REAL4_F90        HUGE_REAL4_F90_Y
  275. #define HUGE_REAL8_F90        HUGE_REAL8_F90_Y
  276. #define HUGE_REAL16_F90        HUGE_REAL16_F90_Y
  277. #endif
  278.  
  279. /* MAXEXPONENT = emax of real and double precision in the model */
  280. /* YMP: */
  281. #define MAXEXPONENT_F90_Y        8189
  282. #define MAXEXPONENT_REAL4_F90_Y        8189
  283. #define MAXEXPONENT_REAL8_F90_Y        8189
  284. #define MAXEXPONENT_REAL16_F90_Y    8189
  285. /* IEEE: */
  286. #define MAXEXPONENT_REAL4_F90_IEEE     128
  287. #define MAXEXPONENT_REAL8_F90_IEEE    1024
  288. #if    defined(_CRAYMPP) || defined(__mips)
  289. #define MAXEXPONENT_REAL16_F90_IEEE    1023
  290. #elif    defined(_WORD32) || (defined(_CRAY1) && defined(_CRAYIEEE)) || \
  291.     (defined(_LITTLE_ENDIAN) && defined(__sv2))
  292. #define MAXEXPONENT_REAL16_F90_IEEE     16384
  293. #elif defined(_LITTLE_ENDIAN) && !defined(__sv2)
  294. #define MAXEXPONENT_REAL16_F90_IEEE     16383
  295. #endif
  296.  
  297. #if defined(_CRAYMPP) || defined(_WORD32) || defined(__mips) || \
  298.     (defined(_CRAY1) && defined(_CRAYIEEE)) || defined(_LITTLE_ENDIAN)
  299. #define MAXEXPONENT_REAL4_F90    MAXEXPONENT_REAL4_F90_IEEE
  300. #define MAXEXPONENT_REAL8_F90    MAXEXPONENT_REAL8_F90_IEEE
  301. #define MAXEXPONENT_REAL16_F90    MAXEXPONENT_REAL16_F90_IEEE
  302. #else
  303. #define MAXEXPONENT_F90        MAXEXPONENT_F90_Y
  304. #define MAXEXPONENT_REAL4_F90    MAXEXPONENT_REAL4_F90_Y
  305. #define MAXEXPONENT_REAL8_F90    MAXEXPONENT_REAL8_F90_Y
  306. #define MAXEXPONENT_REAL16_F90    MAXEXPONENT_REAL16_F90_Y
  307. #endif
  308.  
  309. /* MINEXPONENT = emin of real and double precision in the model.
  310.  * For mips do not use the following unless the denormal in the
  311.  * second word is handled consistently across all hardware.  The
  312.  * option to speed up the real(16) will not cause the second word
  313.  * to become zero.
  314.  *         MINEXPONENT_REAL16_F90_IEEE     -967
  315.  * For now, use 1022 - 107 = 915.
  316.  */
  317. /* YMP: */
  318. #define MINEXPONENT_F90_Y        -8188
  319. #define MINEXPONENT_REAL4_F90_Y        -8188
  320. #define MINEXPONENT_REAL8_F90_Y        -8188
  321. #define MINEXPONENT_REAL16_F90_Y    -8188
  322. /* IEEE: */
  323. #define MINEXPONENT_REAL4_F90_IEEE     -125
  324. #define MINEXPONENT_REAL8_F90_IEEE    -1021
  325. #if    defined(_CRAYMPP)
  326. #define MINEXPONENT_REAL16_F90_IEEE    -1021
  327. #elif   defined(__mips)
  328. #define MINEXPONENT_REAL16_F90_IEEE     -915
  329. #elif    defined(_WORD32) || (defined(_CRAY1) && defined(_CRAYIEEE)) || \
  330.     (defined(_LITTLE_ENDIAN) && defined(__sv2))
  331. #define MINEXPONENT_REAL16_F90_IEEE    -16381
  332. #elif defined(_LITTLE_ENDIAN) && !defined(__sv2)
  333. #define MINEXPONENT_REAL16_F90_IEEE    -16382
  334. #endif 
  335.  
  336. #if defined(_CRAYMPP) || defined(_WORD32) || defined(__mips) || \
  337.     (defined(_CRAY1) && defined(_CRAYIEEE)) || defined(_LITTLE_ENDIAN)
  338. #define MINEXPONENT_REAL4_F90    MINEXPONENT_REAL4_F90_IEEE
  339. #define MINEXPONENT_REAL8_F90    MINEXPONENT_REAL8_F90_IEEE
  340. #define MINEXPONENT_REAL16_F90    MINEXPONENT_REAL16_F90_IEEE
  341. #else
  342. #define MINEXPONENT_F90        MINEXPONENT_F90_Y
  343. #define MINEXPONENT_REAL4_F90    MINEXPONENT_REAL4_F90_Y
  344. #define MINEXPONENT_REAL8_F90    MINEXPONENT_REAL8_F90_Y
  345. #define MINEXPONENT_REAL16_F90    MINEXPONENT_REAL16_F90_Y
  346. #endif
  347.  
  348. /* PRECISION for decimal precision of real and double precision in the model.
  349.  * Result=INT((p-1)*LOG10(b))+k.  K is one if b is an integral power of 10,
  350.  *                                otherwise, k=0.
  351.  */
  352. /* YMP: */
  353. #define PRECISION_REAL4_F90_Y   6                   /* real (KIND=4) */
  354. #define PRECISION_REAL8_F90_Y  13                   /* real (KIND=8) */
  355. #define PRECISION_REAL16_F90_Y 28                   /* real (KIND=16) */
  356. /* IEEE: */
  357. #define PRECISION_REAL4_F90_IEEE    6                  /* real (KIND=4) */
  358. #define PRECISION_REAL8_F90_IEEE   15                  /* real (KIND=8) */
  359. #if    defined(_CRAYMPP)
  360. #define PRECISION_REAL16_F90_IEEE  15                  /* real (KIND=16) */
  361. #elif   defined(__mips)
  362. #define PRECISION_REAL16_F90_IEEE  31                /* real (KIND=16) */
  363. #elif   defined(_LITTLE_ENDIAN) && !defined(__sv2)
  364. #define PRECISION_REAL16_F90_IEEE  18                /* real (KIND=16) */
  365. #elif    defined(_WORD32) || (defined(_CRAY1) && defined(_CRAYIEEE)) || \
  366.     (defined(_LITTLE_ENDIAN) && defined(__sv2))
  367. #define PRECISION_REAL16_F90_IEEE  33                /* real (KIND=16) */
  368. #endif
  369.  
  370. #if defined(_CRAYMPP) || defined(_WORD32) || defined(__mips) || \
  371.     (defined(_CRAY1) && defined(_CRAYIEEE)) || defined(_LITTLE_ENDIAN)
  372. #define PRECISION_REAL4_F90    PRECISION_REAL4_F90_IEEE
  373. #define PRECISION_REAL8_F90    PRECISION_REAL8_F90_IEEE
  374. #define PRECISION_REAL16_F90    PRECISION_REAL16_F90_IEEE
  375. #else
  376. #define PRECISION_REAL4_F90    PRECISION_REAL4_F90_Y
  377. #define PRECISION_REAL8_F90    PRECISION_REAL8_F90_Y
  378. #define PRECISION_REAL16_F90    PRECISION_REAL16_F90_Y
  379. #endif
  380.  
  381. /* RADIX for integer, real and double precision in the model. */
  382. /* YMP: */
  383. #define RADIX_F90_Y        2
  384. /* IEEE: */
  385. #define RADIX_F90_IEEE        2
  386. #if defined(_CRAYMPP) || defined(_WORD32) || defined(__mips) || \
  387.     (defined(_CRAY1) && defined(_CRAYIEEE)) || defined(_LITTLE_ENDIAN)
  388. #define RADIX_F90        RADIX_F90_IEEE
  389. #else
  390. #define RADIX_F90        RADIX_F90_Y        
  391. #endif
  392.  
  393. /* RANGE for integer, real and double precision, complex and double complex
  394.  * in the model
  395.  * Integer result = INT(LOG10 (huge)) where huge is the largest positive
  396.  *                  integer in the  model of the same kind.
  397.  * Real result = INT(MIN(LOG10 (huge),-LOG10(tiny))) where huge and tiny are
  398.  *               the largest and smallest positive numbers in the model of the
  399.  *               same kind.
  400.  * For mips, do not use 291 until the option to turn off the slower
  401.  * handling of denormals is not used.  Until that time the second word
  402.  * of a small number could change and thus not indicative of the correct
  403.  * significance of the small number.  Save the following for the future:
  404.  *  RANGE_REAL16_F90_IEEE  291
  405.  */
  406. /* YMP: */
  407. #define RANGE_INT1_F90_Y         2
  408. #define RANGE_INT2_F90_Y         4
  409. #define RANGE_INT4_F90_Y         9
  410. #define RANGE_INT6_F90_Y        13
  411. #define RANGE_INT8_F90_Y        18
  412. #define RANGE_REAL_F90_Y      2465
  413. #define RANGE_REAL4_F90_Y     2465
  414. #define RANGE_REAL8_F90_Y     2465
  415. #define RANGE_REAL16_F90_Y    2465
  416. /* IEEE: */
  417. #define RANGE_INT1_F90_IEEE      2
  418. #define RANGE_INT2_F90_IEEE      4
  419. #define RANGE_INT4_F90_IEEE      9
  420. #if defined (_CRAY1) && defined(_CRAYIEEE)
  421. /* change RANGE_INT6_F90_IEEE 15 for Integer (KIND=6) to allow
  422.  * values to match as 46 bits across PVP systems
  423.  */
  424. #define RANGE_INT6_F90_IEEE     13
  425. #else
  426. #define RANGE_INT6_F90_IEEE     18
  427. #endif
  428. #define RANGE_INT8_F90_IEEE     18
  429. #define RANGE_REAL4_F90_IEEE    37
  430. #define RANGE_REAL8_F90_IEEE   307
  431. #if    defined(_CRAYMPP) || defined(_LITTLE_ENDIAN)
  432. #define RANGE_REAL16_F90_IEEE  307
  433. #elif   defined(__mips)
  434. #define RANGE_REAL16_F90_IEEE  275
  435. #elif    defined(_WORD32) || (defined(_CRAY1) && defined(_CRAYIEEE)) || \
  436.     (defined(_LITTLE_ENDIAN) && defined(__sv2))
  437. #define RANGE_REAL16_F90_IEEE  4931
  438. #endif
  439.  
  440. #if defined(_CRAYMPP) || defined(_WORD32) || defined(__mips) || \
  441.     (defined(_CRAY1) && defined(_CRAYIEEE)) || defined(_LITTLE_ENDIAN)
  442. #define RANGE_INT1_F90        RANGE_INT1_F90_IEEE     /* Integer (KIND=1) */
  443. #define RANGE_INT2_F90        RANGE_INT2_F90_IEEE     /* Integer (KIND=2) */
  444. #define RANGE_INT4_F90        RANGE_INT4_F90_IEEE     /* Integer (KIND=4) */
  445. #define RANGE_INT6_F90        RANGE_INT6_F90_IEEE     /* Integer (KIND=6) */
  446. #define RANGE_INT8_F90        RANGE_INT8_F90_IEEE     /* Integer (KIND=8) */
  447. #define RANGE_REAL4_F90        RANGE_REAL4_F90_IEEE    /* real (KIND=4)  */
  448. #define RANGE_REAL8_F90        RANGE_REAL8_F90_IEEE    /* real (KIND=8)  */
  449. #define RANGE_REAL16_F90    RANGE_REAL16_F90_IEEE    /* real (KIND=16) */
  450. #else
  451. #define RANGE_INT1_F90        RANGE_INT1_F90_Y      /* Integer (KIND=1) */
  452. #define RANGE_INT2_F90        RANGE_INT2_F90_Y      /* Integer (KIND=2) */
  453. #define RANGE_INT4_F90        RANGE_INT4_F90_Y      /* Integer (KIND=4) */
  454. #define RANGE_INT6_F90        RANGE_INT6_F90_Y      /* Integer (KIND=6) */
  455. #define RANGE_INT8_F90        RANGE_INT8_F90_Y      /* Integer (KIND=8) */
  456. #define RANGE_REAL_F90        RANGE_REAL_F90_Y     /* real (KIND=4)  */
  457. #define RANGE_REAL4_F90        RANGE_REAL4_F90_Y     /* real (KIND=4)  */
  458. #define RANGE_REAL8_F90        RANGE_REAL8_F90_Y     /* real (KIND=8)  */
  459. #define RANGE_REAL16_F90    RANGE_REAL16_F90_Y    /* real (KIND=16) */
  460. #endif
  461.  
  462. /* TINY for real and double precision is the smallest number in the model.
  463.  * Result is b**(emin-1)
  464.  *
  465.  * HEX values for TINY:
  466.  *
  467.  * YMP:  TINY (in hex)                       IEEE: TINY (in hex)
  468.  * R*4     2004800000000000                |           800000
  469.  * R*8     2004800000000000                |   10000000000000
  470.  * R*16    2004800000000000                |    1000000000000
  471.  *                        0                |                0
  472.  *
  473.  * SGI HEX for R*16
  474.  * R*16                                    |  6B0000000000000
  475.  *                                         | 0000000000000000
  476.  * Tiny for double-double (real(kind=16) for mips must be less than
  477.  * TINY_REAL16_F90_IEEE 4.008336720017945555992216102700324100E-292L
  478.  * since the use of an exponent in the range of -967 could cause the
  479.  * second word to change and thus the entire value would be incorrect.
  480.  * If the denormals in the second word get handled correctly across
  481.  * all sgi platforms, then change TINY to the larger value and:
  482.  *
  483.  * SGI HEX for R*16
  484.  * R*16                                    |  370000000000000
  485.  *                                         | 0000000000000000
  486.  *
  487.  * For now, use 1022 - 107 = 915 as the minexponent.
  488.  *
  489.  */
  490.  
  491. /* YMP: */
  492. #define TINY_REAL4_F90_Y   0.73344154702194e-2465 /* 0200044000000000000000 */
  493. #define TINY_REAL8_F90_Y   0.73344154702194e-2465 /* 0200044000000000000000 */
  494. #define TINY_REAL16_F90_Y  0.733441547021938866248564956819e-2465L
  495.                                                    /* 0200044000000000000000 */
  496.                                                    /* 0000000000000000000000 */
  497. /* IEEE: */
  498. #define TINY_REAL4_F90_IEEE   1.175494350822287508E-38 /* 2**(-125-1) */
  499. #define TINY_REAL8_F90_IEEE   2.225073858507201383E-308 /* 2**(-1021-1) */
  500. #if    defined(_CRAYMPP) || defined(_LITTLE_ENDIAN)
  501. #define TINY_REAL16_F90_IEEE  2.225073858507201383E-308 /* 2***(-1021-1) */
  502. #elif    defined(__mips)
  503. #define TINY_REAL16_F90_IEEE 1.8051943758648295760692620811737470000E-276L
  504. #elif    defined(_WORD32) || (defined(_CRAY1) && defined(_CRAYIEEE))
  505. #define TINY_REAL16_F90_IEEE 3.362103143112093506262677817321752603E-4932L
  506.                                                         /* 2**-16382 */
  507. #endif
  508.  
  509. #if defined(_CRAYMPP) || defined(_WORD32) || defined(__mips) || \
  510.     (defined(_CRAY1) && defined(_CRAYIEEE)) || defined(_LITTLE_ENDIAN)
  511. #define TINY_REAL4_F90    TINY_REAL4_F90_IEEE  /* real (KIND=4) */
  512. #define TINY_REAL8_F90    TINY_REAL8_F90_IEEE  /* real (KIND=8) */
  513. #define TINY_REAL16_F90    TINY_REAL16_F90_IEEE /* real (KIND=16) */
  514. #else
  515. #define TINY_REAL4_F90    TINY_REAL4_F90_Y     /* real (KIND=4) */
  516. #define TINY_REAL8_F90    TINY_REAL8_F90_Y     /* real (KIND=8) */
  517. #define TINY_REAL16_F90    TINY_REAL16_F90_Y    /* real (KIND=16) */
  518. #endif
  519.